package com.tree.backend.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tree.backend.common.Result;
import com.tree.backend.entity.dto.DemandAuditDTO;
import com.tree.backend.entity.dto.DemandDTO;
import com.tree.backend.entity.dto.DemandQueryDTO;
import com.tree.backend.entity.pojo.Demand;
import com.tree.backend.entity.vo.DemandListVO;
import com.tree.backend.entity.vo.DemandStatsVO;
import com.tree.backend.entity.vo.DemandVO;
import com.tree.backend.entity.vo.EnterpriseVO;
import java.util.List;
import java.util.Map;
import com.tree.backend.service.IDemandService;
import com.tree.backend.utils.UserContext;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;


/**
 * <p>
 * 需求表 前端控制器
 * </p>
 *
 * @author tree
 * @since 2025-11-06
 */
@RestController
@RequestMapping("/demand")
@RequiredArgsConstructor
public class DemandController {

    private final IDemandService demandService;

    /**
     * 获取需求列表
     * @param queryDTO 查询参数
     * @return 分页后的需求列表
     */
    @GetMapping
    public Result<Page<DemandListVO>> getDemandList(DemandQueryDTO queryDTO) {
        // 设置默认分页参数
        if (queryDTO.getPageNum() == null) {
            queryDTO.setPageNum(1);
        }
        if (queryDTO.getPageSize() == null) {
            queryDTO.setPageSize(10);
        }
        
        Page<DemandListVO> page = demandService.getDemandList(queryDTO);
        return Result.success(page);
    }

    /**
     * 获取需求详情
     * @param id 需求ID
     * @return 需求详情
     */
    @GetMapping("/{id}")
    public Result<DemandVO> getDemandDetail(@PathVariable Long id) {
        DemandVO demandVO = demandService.getDemandDetail(id);
        return Result.success(demandVO);
    }

    /**
     * 新增需求
     * @param demandDTO 需求数据
     * @return 创建的需求
     */
    @PostMapping
    public Result<Demand> addDemand(@Valid @RequestBody DemandDTO demandDTO) {
        // 从上下文获取当前用户信息
        Long userId = UserContext.getCurrentUserId();
        Integer userType = UserContext.getCurrentUserType();
        
        Demand demand = demandService.addDemand(demandDTO, userId, userType);
        return Result.success(demand);
    }

    /**
     * 更新需求
     * @param id 需求ID
     * @param demandDTO 需求数据
     * @return 更新后的需求
     */
    @PutMapping("/{id}")
    public Result<Demand> updateDemand(@PathVariable Long id, @Valid @RequestBody DemandDTO demandDTO) {
        Demand demand = demandService.updateDemand(id, demandDTO);
        return Result.success(demand);
    }

    /**
     * 删除需求
     * @param id 需求ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    public Result<Boolean> deleteDemand(@PathVariable Long id) {
        demandService.deleteDemand(id);
        return Result.success(true);
    }

    /**
     * 审核需求
     * @param id 需求ID
     * @param auditDTO 审核数据
     * @return 操作结果
     */
    @PutMapping("/{id}/audit")
    public Result<Boolean> auditDemand(@PathVariable Long id, @Valid @RequestBody DemandAuditDTO auditDTO) {
        // 从上下文获取当前审核人信息
        Long auditUserId = UserContext.getCurrentUserId();
        
        demandService.auditDemand(id, auditDTO, auditUserId);
        return Result.success(true);
    }

    /**
     * 获取需求统计信息
     * @return 统计数据
     */
    @GetMapping("/stats")
    public Result<DemandStatsVO> getDemandStats() {
        DemandStatsVO statsVO = demandService.getDemandStats();
        return Result.success(statsVO);
    }
    
    /**
     * 获取愿意接单的企业列表
     * @param demandId 需求ID
     * @return 企业列表
     */
    @GetMapping("/{demandId}/potential-enterprises")
    public Result<List<EnterpriseVO>> getPotentialEnterprises(@PathVariable Long demandId) {
        List<EnterpriseVO> enterprises = demandService.getPotentialEnterprises(demandId);
        return Result.success(enterprises);
    }
    
    /**
     * 选择企业接单
     * @param demandId 需求ID
     * @param requestBody 请求体，包含enterpriseId
     * @return 操作结果
     */
    @PostMapping("/{demandId}/select-enterprise")
    public Result<Boolean> selectEnterprise(@PathVariable Long demandId, @RequestBody Map<String, Long> requestBody) {
        Long enterpriseId = requestBody.get("enterpriseId");
        if (enterpriseId == null) {
            return Result.error(400, "企业ID不能为空");
        }
        boolean result = demandService.selectEnterprise(demandId, enterpriseId);
        return Result.success(result);
    }
}
